//// : annotations/InterfaceExtractorProcessor.java
//// APT-based annotation processing.
//// {Exec: apt -factory
//// annotations.InterfaceExtractorProcessorFactory
//// Multiplier.java -s ../annotations}
// package annotations;
// import com.sun.mirror.apt.*;
// import com.sun.mirror.declaration.*;
// import java.io.*;
// import java.util.*;
//
// public class InterfaceExtractorProcessor
// implements AnnotationProcessor {
// private final AnnotationProcessorEnvironment env;
// private ArrayList<MethodDeclaration> interfaceMethods =
// new ArrayList<MethodDeclaration>();
// public InterfaceExtractorProcessor(
// AnnotationProcessorEnvironment env) { this.env = env; }
// public void process() {
// for(TypeDeclaration typeDecl :
// env.getSpecifiedTypeDeclarations()) {
// ExtractInterface annot =
// typeDecl.getAnnotation(ExtractInterface.class);
// if(annot == null)
// break;
// for(MethodDeclaration m : typeDecl.getMethods())
// if(m.getModifiers().contains(Modifier.PUBLIC) &&
// !(m.getModifiers().contains(Modifier.STATIC)))
// interfaceMethods.add(m);
// if(interfaceMethods.size() > 0) {
// try {
// PrintWriter writer =
// env.getFiler().createSourceFile(annot.value());
// writer.println("package " +
// typeDecl.getPackage().getQualifiedName() +";");
// writer.println("public interface " +
// annot.value() + " {");
// for(MethodDeclaration m : interfaceMethods) {
// writer.print(" public ");
// writer.print(m.getReturnType() + " ");
// writer.print(m.getSimpleName() + " (");
// int i = 0;
// for(ParameterDeclaration parm :
// m.getParameters()) {
// writer.print(parm.getType() + " " +
// parm.getSimpleName());
// if(++i < m.getParameters().size())
// writer.print(", ");
// }
// writer.println(");");
// }
// writer.println("}");
// writer.close();
// } catch(IOException ioe) {
// throw new RuntimeException(ioe);
// }
// }
// }
// }
// } ///:~
